/*
看着这样的“回”形图案你晕吗？让我们不用数组，来做出它。

输入：
n。正方形的边长

输出：
边长为 n 的数字回形方阵。
*/

/*
测试用例1:
输入：
3↵
输出：
1  2  3↵
8  9  4↵
7  6  5↵

测试用例2:
输入：
4↵
输出：
1  2  3  4↵
12 13 14  5↵
11 16 15  6↵
10  9  8  7↵

测试用例3:
输入：
5↵
输出：
1  2  3  4  5↵
16 17 18 19  6↵
15 24 25 20  7↵
14 23 22 21  8↵
13 12 11 10  9↵
*/
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
	
	// 接收用户输入
	int n;
	cin >> n;
	
	// 构建矩阵
	vector<vector<int>> matrix(n, vector<int>(n));
	int num=1;
	int moment=0;  // 惯性 0右移 1下移 2左移 3上移
	for (int i=0,j=0;;)
	{
		matrix[i][j] = num;
				
		// 考虑向右移
		if (j < n-1)
		{
			if (matrix[i][j+1] == 0 && moment == 0)
			{
				j++;
				moment = 0;
				num++;
				continue;
			}
		}
		if (moment == 0)
		{
			moment = 1;
		}

		
		// 考虑向下移
		if (i < n-1)
		{
			if (matrix[i+1][j] == 0 && moment == 1)
			{
				i++;
				moment = 1;
				num++;
				continue;
			}
		}
		if (moment == 1)
		{
			moment = 2;
		}

		
		// 考虑向左移
		if (j > 0)
		{
			if (matrix[i][j-1] == 0 && moment == 2)
			{
				j--;
				moment = 2;
				num++;
				continue;
			}
			
		}
		if (moment == 2)
		{
			moment = 3;
		}
		
		
		// 考虑向上移
		if (i > 0)
		{
			if (matrix[i-1][j] == 0 && moment == 3)
			{
				i--;
				moment = 3;
				num++;
				continue;
			}
		}
		if (moment == 3)
		{
			moment = 0;
		}

		
		// 结束
		if (num == pow(n, 2))
			break;
	}
	
	for (int i=0; i<n; i++)
	{
		for (int j=0; j<n; j++)
		{
			cout << matrix[i][j];
			if (j != n-1)
				cout << "\t";
		}
		cout << endl;
	}
}